# ---- 构建 ----
# 使用一个包含Maven和JDK的镜像来构建项目
FROM maven:3.8.4-openjdk-17 AS builder
# 设置工作目录
WORKDIR /build
# 复制 pom.xml 并下载依赖
# 这样可以利用Docker的层缓存，只有当pom.xml变化时才重新下载依赖

RUN mkdir -p /root/.m2 && \
    echo '<settings><mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror></mirrors></settings>' > /root/.m2/settings.xml
COPY pom.xml .

# 使用 -s 参数指定我们刚刚创建的配置文件
RUN mvn -s /root/.m2/settings.xml dependency:go-offline

# 复制源代码并打包
COPY src ./src
# 打包时同样使用镜像配置
RUN mvn -s /root/.m2/settings.xml package -DskipTests
# ---- 阶段 2: 运行 ----

# 基础镜像
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 将官方的deb.debian.org源替换为清华大学的镜像源
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# --- 环境准备：安装Python及其依赖 ---
# 更新包管理器并安装python3和pip，然后清理缓存以减小镜像体积
RUN apt-get update && \
    apt-get install -y python3 python3-pip && \
    rm -rf /var/lib/apt/lists/*
# 复制Python脚本和依赖声明文件
COPY scripts/ /app/scripts/
# 安装Python依赖库
RUN pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple psutil
# 赋予Python脚本执行权限
RUN chmod +x /app/scripts/*.py

# --- 应用准备：解压Spring Boot Jar以解决类路径问题 ---
COPY --from=builder /build/target/code_sandbox-0.0.1-SNAPSHOT.jar app.jar
# 使用Spring Boot Layertools来解压JAR文件，以便标准java命令可以找到所有类
RUN java -Djarmode=layertools -jar app.jar extract
# 删除原始的fat JAR，因为它已经被解压了
RUN rm app.jar

# 创建一个系统用户组和用户，用于运行应用
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser

# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 更改应用文件所有权为新创建的用户
RUN chown -R appuser:appgroup /app
# 切换到非root用户
USER appuser
# --- 运行应用 ---

# 暴露端口
EXPOSE 8083

# 工作目录应为解压后的根目录 /app
WORKDIR /app

# 入口
ENTRYPOINT ["java", "-cp", "application/BOOT-INF/classes:dependencies/BOOT-INF/lib/*", "com.dragon.CodeSandboxApplication"]